home *** CD-ROM | disk | FTP | other *** search
/ Libris Britannia 4 / science library(b).zip / science library(b) / DDJMAG / DDJ9203.ZIP / OOPASM.ZIP / FILE.ASM < prev    next >
Assembly Source File  |  1990-07-11  |  7KB  |  264 lines

  1.     .MODEL    SMALL
  2.  
  3.     INCLUDE    equates.inc
  4.     INCLUDE    instance.inc
  5.     INCLUDE    messages.inc
  6.     INCLUDE    objects.inc
  7.  
  8. IF1
  9.     INCLUDE    macros.mac
  10.     INCLUDE    objects.mac
  11. ENDIF
  12.  
  13.     EXTRN    sendMsg:NEAR
  14.  
  15.     EXTRN    Dir:WORD
  16.     EXTRN    DosError:WORD
  17.     EXTRN    FileDlg:WORD
  18.     EXTRN    FileName:WORD
  19.     EXTRN    MemMngr:WORD
  20.     EXTRN    Self:WORD
  21.  
  22.     .CODE
  23.  
  24.     PUBLIC getFileName
  25. COMMENT    %
  26. ==============================================================================
  27. Gets name of file to open from one of FileDlg's slave objects and moves it to
  28. the DTA.
  29.  
  30. =============================================================================%
  31. getFileName    PROC    NEAR
  32.     push        Self
  33.     call        getDrive        ;Get current drive
  34.     call        getPath            ;Get current path
  35.     getInst        si,ActiveSlave,FileDlg    ;Get ptr to active slave obj
  36.     getInst        si,TxtPtr,si        ;Get ptr to file name string
  37. gfn1:    lodsb                    ;Get a byte
  38.     mov        Bptr[di],al        ;Move to destination
  39.     inc        di            ;Point to next dest byte
  40.     notZero        al,gfn1            ;Not end of string? - Loop
  41.  
  42.     mov        al,Bptr[di-2]        ;Get 2nd previous byte
  43.     neq        al,Space,gfn2        ;Not a space? - Exit
  44.     mov        Bptr[di-2],0        ;Else - Overwrite with zero
  45. gfn2:    pop        Self
  46.     ret
  47. getFileName    ENDP
  48.  
  49.  
  50.  
  51.     PUBLIC getDrive
  52. COMMENT    %
  53. ==============================================================================
  54. Gets the current or default disk drive.
  55.  
  56. Passes:    di - Pointer to next available byte in file name buffer
  57.  
  58. =============================================================================%
  59. getDrive    PROC    NEAR
  60.     lea        di,FileName        ;Get ptr to file name buffer
  61.     mov        ah,19h            ;Pass service number
  62.     int        DosInt            ;DOS interrupt
  63.     add        al,41h            ;Convert drive# to ASCII
  64.     mov        Bptr[di],al        ;Set drive
  65.     mov        Bptr[di+1],':'        ;Colon
  66.     mov        Bptr[di+2],'\'        ;Slash
  67.     add        di,3            ;Account for drive (C:\)
  68.     ret
  69. getDrive    ENDP
  70.  
  71.  
  72.  
  73.     PUBLIC getPath
  74. COMMENT    %
  75. ==============================================================================
  76. Gets the current path.
  77.  
  78. Passed:    di - Pointer to next available byte in file name buffer
  79.  
  80. Passes:    di - Pointer to next available byte in file name buffer
  81.  
  82. =============================================================================%
  83. getPath    PROC    NEAR
  84.     mov        ah,47h            ;Pass service number
  85.     mov        dl,0            ;Use default drive
  86.     mov        si,di            ;Pass ptr to name buffer
  87.     int        DosInt            ;DOS interrupt
  88.     jc        gpth2            ;Jump if error
  89.  
  90. gpth1:    lodsb                    ;Get a byte
  91.     notZero        al,gpth1        ;Not end of path? - Loop
  92.     dec        si            ;Overwrite terminal zero
  93.     eq        di,si,gpth3        ;Exit if root directory
  94.     mov        di,si            ;Return ptr to name buffer
  95.     mov        Bptr[di],'\'        ;Move backslash to destination
  96.     inc        di            ;Point to next dest byte
  97.     jmp        gpth3
  98.  
  99. gpth2:    send        DosError,Error,ax    ;Handle error
  100. gpth3:    ret
  101. getPath    ENDP
  102.  
  103.  
  104.  
  105. IF Dbug
  106.     PUBLIC ?OpenFile
  107. ENDIF
  108. COMMENT    %
  109. ==============================================================================
  110. Opens the specified file unless it is a subdirectory in which case it moves
  111. to that subdirectory.
  112.  
  113. =============================================================================%
  114. ?OpenFile    PROC    NEAR
  115.     setInst        FileHdl,Nil,Self,2    ;Clear file handle
  116.     lea        dx,FileName        ;Pass ptr to file name
  117.     mov        al,11000010b        ;Pass open mode
  118.     mov        ah,3Dh            ;Open file service number
  119.     int        DosInt            ;DOS interrupt
  120.     jc        opnf1            ;Jump if error
  121.  
  122.     setInst        FileHdl,ax        ;Set file handle
  123.     send        File,Read        ;Read file
  124.     send        FileDlg,Clear        ;Clear dialog
  125.     jmp        opnf2            ;Exit
  126.  
  127. opnf1:    call        ?ChangeDir        ;Change dir if dir selected
  128. opnf2:    ret
  129. ?OpenFile    ENDP
  130.  
  131.  
  132.  
  133. COMMENT    %
  134. ==============================================================================
  135. Changes the current directory to the specified subdirectory.
  136.  
  137. Passed:    ax - Error code
  138.  
  139. =============================================================================%
  140. ?ChangeDir    PROC    NEAR
  141.     push        ax
  142.     lea        dx,FileName        ;Pass ptr to file name
  143.     mov        ah,3Bh            ;Change dir service number
  144.     int        DosInt            ;DOS interrupt
  145.     pop        ax
  146.     jnc        chd1            ;Jump if no error encountered
  147.  
  148.     send        DosError,Error,ax    ;Handle error
  149.  
  150. chd1:    setInst        ?ReadDir,Nil,Dir,2    ;Must re-read directory
  151.     send        Dir,Refresh        ;Refresh directory
  152.     send        FileDlg,Read        ;Handle keyboard/mouse events
  153.     ret
  154. ?ChangeDir    ENDP
  155.  
  156.  
  157.  
  158. IF Dbug
  159.     PUBLIC readFile
  160. ENDIF
  161. COMMENT    %
  162. ==============================================================================
  163. Opens the specified file.
  164.  
  165. =============================================================================%
  166. readFile    PROC    NEAR
  167.     getInst        bx,FileHdl,Self        ;Get file handle
  168.     null        bx,rdfl1        ;Null handle? - Exit
  169.  
  170.     getInst        dx,MemSeg        ;Get memory segment
  171.     null        dx,rdfl1        ;Null segment? - Exit
  172.  
  173.     push        ds
  174.     getInst        ax,MemSize        ;Get amount of free memory
  175.     mov        cl,16            ;Paragraph size
  176.     mul        cl            ;Calc memory size in byte
  177.     mov        cx,ax            ;Pass memory size
  178.     mov        ds,dx            ;Pass data segment
  179.     mov        dx,0            ;Pass segment offset
  180.     mov        ah,3Fh            ;Pass service number
  181.     int        DosInt            ;DOS interrupt
  182.     pop        ds
  183.     jc        rdfl2            ;Jump if error
  184.     setInst        BytesRead,ax        ;Set number of bytes read
  185.     jmp        rdfl1            ;Exit
  186.  
  187. rdfl2:    send        DosError,Error,ax    ;Handle error
  188. rdfl1:    ret
  189. readFile    ENDP
  190.  
  191.  
  192.  
  193. COMMENT    %
  194. ==============================================================================
  195. Save the program's initial path for future reference.
  196.  
  197. =============================================================================%
  198. saveHomePath    PROC    NEAR
  199.     call        getDrive        ;Get current drive
  200.     call        getPath            ;Get current path
  201.     lea        di,HomePath        ;Destination buffer addr
  202.     lea        si,FileName        ;Source addr
  203. scp1:    lodsb                    ;Get a byte
  204.     mov        Bptr[di],al        ;Move to destination
  205.     inc        di            ;Point to next dest byte
  206.     notZero        al,scp1            ;Not end of string? - Loop
  207.     mov        Bptr[di-2],0        ;Replace last byte with zero
  208.     ret
  209. saveHomePath    ENDP
  210.  
  211.  
  212.  
  213.     PUBLIC getHomePath
  214. COMMENT    %
  215. ==============================================================================
  216. Gets the program's home path.
  217.  
  218. Passed:    di - Pointer to next available byte in file name buffer
  219.  
  220. Passes:    di - Pointer to next available byte in file name buffer
  221.  
  222. =============================================================================%
  223. getHomePath    PROC    NEAR
  224.     lea        si,HomePath        ;Get addr of start-up path
  225. ghp1:    lodsb                    ;Get a byte
  226.     mov        Bptr[di],al        ;Save it
  227.     inc        di            ;Point to next dest byte
  228.     notZero        al,ghp1            ;Loop if not end of path
  229.     mov        Bptr[di-1],'\'        ;Overwrite zero with backslash
  230.     ret
  231. getHomePath    ENDP
  232.  
  233.  
  234.  
  235.     .DATA
  236.  
  237. HomePath    DB    64 DUP (0)        ;Program's home path name
  238.  
  239. defMsg    File,\
  240.     Open,\
  241.     <getFileName,,?OpenFile>
  242.  
  243. defMsg    File,\
  244.     Read,\
  245.     <,,readFile>
  246.  
  247. defMsg    File,\
  248.     Init,\
  249.     <,,saveHomePath>
  250.  
  251. defObj    File,\
  252.     <MemMngr>,\
  253.     <MemSize,2,80h,\
  254.     MemSeg,2,Nil,\
  255.     FileHdl,2,Nil,\
  256.     BytesRead,2,Nil>,\
  257.     <Open,Read,Init>
  258.  
  259.  
  260.  
  261.     END
  262.  
  263.  
  264.